在读取Python文件中的行时跳过前几行 |
您所在的位置:网站首页 › python 文件多少行 › 在读取Python文件中的行时跳过前几行 |
我想在阅读文本文件时跳过前17行。 假设文件看起来像: 1234567891011121314151617180 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 good stuff我只想要好东西。 我正在做的事情要复杂得多,但这是我遇到的麻烦。 相关讨论 stackoverflow.com/questions/620367/或stackoverflow.com/questions/4796764/等。?使用切片,如下所示: 12with open('yourfile.txt') as f: lines_after_17 = f.readlines()[17:]如果文件太大而无法加载到内存中: 12345with open('yourfile.txt') as f: for _ in range(17): next(f) for line in f: # do stuff 相关讨论 我使用第二种解决方案在一个文件的末尾读取10行,该行有800万(8e6)行,大约需要22秒。对于这么长的文件(?250 MB),这仍然是首选(=最快)的方法吗? 我会使用tail。 @wim:我想,tail在Windows上不起作用。此外,我并不总是想阅读最后10行。我希望能够阅读中间的几行内容。 (例如,如果我在同一文件中的?4e6行之后读取10行,则仍然需要一半的时间,?11秒) 事实是,您需要在行号?4e6之前读取全部内容,才能知道行分隔符字节的位置,否则您将不知道经过了多少行。没有办法神奇地跳到行号。大约250 MB应该可以将整个文件读取到内存中,那并不是特别大的数据。 @riddleculous参见stackoverflow.com/q/3346430/2491761以获取最后一行从索引17开始使用itertools.islice。它将自动跳过前17行。 1234import itertools with open('file.txt') as f: for line in itertools.islice(f, 17, None): # start=17, stop=None # process lines 相关讨论 可能是最好的答案 12for line in dropwhile(isBadLine, lines): # process as you see fit完整演示: 12345678from itertools import * def isBadLine(line): return line=='0' with open(...) as f: for line in dropwhile(isBadLine, f): # process as you see fit优点:这可以很容易地扩展到前缀行比" 0"复杂(但不相互依赖)的情况。 此解决方案帮助我跳过了linetostart变量指定的行数。 如果您也想跟踪索引,则可以得到索引(int)和行(字符串)。 在您的情况下,可以将linetostart替换为18,或者将18分配给linetostart变量。 123f = open("file.txt", 'r') for i, line in enumerate(f, linetostart): #Your code以下是前2个答案的时间结果。请注意," file.txt"是一个文本文件,包含100,000多行随机字符串,文件大小为1MB +。 使用itertools: 12345678import itertools from timeit import timeit timeit("""with open("file.txt","r") as fo: for line in itertools.islice(fo, 90000, None): line.strip()""", number=100) >>> 1.604976346003241使用两个for循环: 123456789from timeit import timeit timeit("""with open("file.txt","r") as fo: for i in range(90000): next(fo) for j in fo: j.strip()""", number=100) >>> 2.427317383000627显然,在处理大文件时,itertools方法更有效。 如果您不想一次将整个文件读入内存,可以使用一些技巧: 使用next(iterator),您可以前进到下一行: 123456with open("filename.txt") as f: next(f) next(f) next(f) for line in f: print(f)当然,这很难看,所以itertools有一个更好的方法: 123456from itertools import islice with open("filename.txt") as f: # start at line 17 and never stop (None), until the end for line in islice(f, 17, None): print(f)如果是桌子。 pd.read_table("path/to/file", sep="\t", index_col=0, skiprows=17) 这是一种获取文件中两个行号之间的行的方法: 12345678910111213141516import sys def file_line(name,start=1,end=sys.maxint): lc=0 with open(s) as f: for line in f: lc+=1 if lc>=start and lc EOF您可以使用List-Comprehension使其成为单线: 1[fl.readline() for i in xrange(17)]PEP 202和Python文档中有关列表理解的更多信息。 相关讨论 将这些行存储在只会收集垃圾的列表中没有多大意义。 @wim:内存开销是微不足道的(这可能是不可避免的,因为除非您跳到文件中的任意点,否则您将需要对这些行进行O(n)处理);我只是不认为它非常可读。 我同意@wim,如果您要放弃结果,请使用循环。列表理解的全部要点是您打算存储列表。您可以轻松地将for循环放在一行上。 或在0内存双端队列中使用生成器。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |